/*
 * stringUtils.h
 * 判断字符串是什么类型
 *  Created on: 2016年8月28日
 *      Author: LongShu
 */
#ifndef UTILS_STRINGUTILS_H_
#define UTILS_STRINGUTILS_H_

#define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
#define IS_DIGIT(c) ((c) >= '0' && (c) <= '9')
#define IS_ALPHA(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z'))
#define IS_HEX_DIGIT(c) (((c) >= 'A' && (c) <= 'F') || ((c) >= 'a' && (c) <= 'f'))

#define TYPE_NON_NUMBER 0
#define TYPE_INTEGER 1
#define TYPE_HEX_INTEGER 2
#define TYPE_FLOAT 3

/*
 * is_number(char *)
 * 函数判断字符串是否为数字。
 * 如果不是，返回0。
 * 如果是整数，返回1。
 * 如果是十六进制整数，返回2.
 * 如果是小数，返回3
 */
int is_number(char * s) {
	int base = 10;
	char *ptr;
	int type = 0;
	if (s == NULL)
		return 0;
	ptr = s; /* skip blank */
	while (IS_BLANK(*ptr)) {
		ptr++;
	} /* skip sign */
	if (*ptr == '-' || *ptr == '+') {
		ptr++;
	} /* first char should be digit or dot*/
	if (IS_DIGIT(*ptr) || ptr[0] == '.') {
		if (ptr[0] != '.') { /* handle hex numbers */
			if (ptr[0] == '0' && ptr[1] && (ptr[1] == 'x' || ptr[1] == 'X')) {
				type = TYPE_HEX_INTEGER;
				base = 16;
				ptr += 2;
			} /* Skip any leading 0s */
			while (*ptr == '0') {
				ptr++;
			} /* Skip digit */
			while (IS_DIGIT(*ptr) || (base == 16 && IS_HEX_DIGIT(*ptr))) {
				ptr++;
			}
		} /* Handle dot */
		if (base == 10 && *ptr && ptr[0] == '.') {
			type = TYPE_FLOAT;
			ptr++;
		} /* Skip digit */
		while (type == TYPE_FLOAT && base == 10 && IS_DIGIT(*ptr)) {
			ptr++;
		} /* if end with 0, it is number */
		if (*ptr == 0)
			return (type > 0) ? type : TYPE_INTEGER;
		else
			type = TYPE_NON_NUMBER;
	}
	return type;
}

#endif /* UTILS_STRINGUTILS_H_ */
